//
// Created by 17328 on 2025/8/18.
//

// 定义宏_DEBUG (DEBUG模式的开关)
#define __DEBUG
// 只有在 定义了 __DEBUG 的情况下，后面的代码才会生效，否则进入 #else 部分。
#ifdef __DEBUG
//#define DEBUG(format,...) std::printf(format, ##__VA_ARGS__)
//可打印文件名、行号
#define DEBUG(format,...) printf("FILE: %s, LINE: %d: " format "\n", __FILE__, __LINE__, ##__VA_ARGS__)
#else
// 如果没有定义 __DEBUG，宏 DEBUG 会被替换为空，相当于什么都不做。
// 所以在 release 模式下写 DEBUG("...") 不会有任何输出，也不会增加运行开销。
#define DEBUG(format, ...)
#endif

/*
 * #ifndef AGC_H → 如果没有定义 AGC_H，则继续编译
 * #define AGC_H → 定义一个宏，标记该头文件已被包含
 * 下次再遇到 #include "Agc.h" 时，宏已定义，就跳过
 * 作用等同于：#pragma once
 */

#ifndef AGC_H
#define AGC_H

class Agc {
private:
    float AgcActionValue;

    // 头文件里直接定义函数（构造函数/析构函数/普通函数）的情况
    // 1. 只有一个 .cpp 文件包含这个头文件（include）: 编译器只会生成一份函数实现 → 没问题。
    // 2. 多个 .cpp 文件包含这个头文件（include）: 每个 .cpp 文件都会生成一份函数实现 → 链接器会报 multiple definition 或 重复符号 错误。
    // 3. C++ 标准里规定：类内定义的函数自动视为 inline（即使没写 inline 关键字）。
    Agc() {
        AgcActionValue = 0;
    }

    static Agc* Instance;

public:
    // value数组：多个能够发有功装置的功率，len是数组长度即设备个数。
    void SetAgcActionValue(float value[], int len);
    float GetAgcActionValue();
    static Agc* GetInstance();
};

#endif //AGC_H
